# coding:utf-8



import select
import socket
import queue
import sys

server = socket.socket()
server.bind(('localhost', 9000))
server.listen(1000)

server.setblocking(False)  # 不阻塞

inputs = [server, ]
# inputs = [server,conn] # [conn,]

outputs = []  # r1
msg_dic = {}

while True:
    readable, writeable, exceptional = select.select(inputs, outputs, inputs)
    print(readable, writeable, exceptional)

    for r in readable:
        if r is server:  # 如果来了一个新连接
            conn, addr = server.accept()  # 没有连接就报错s
            print(conn, addr)
            inputs.append(conn)  # 是因为这个新建立的连接还没
            # 有发数据过来,现在就接收的话程序会报错
            # 所以要想实现这个客户端发数据来时server端能知道,就需要让select再
            # 监测这个conn
            msg_dic[conn] = queue.Queue()  # 初始化一个队列,后面存要返回给这个客户端的数据
        else:
            data = r.recv(1024)
            print('收到数据', data)
            msg_dic[r].put(data)

            outputs.append(r)  # 放入返回的连接队列里
            # r.send(data)
            # print('send done...')

    for w in writeable:  # 要返回给客户端的连接列表
        data_to_client = msg_dic[w].get()
        w.send(data_to_client)  # 返回给客户端源数据

        outputs.remove(w)  # 确保下一次循环的时候writeable,不返回已经处理完的连接了

    for e in exceptional:
        if e in outputs:
            outputs.remove(e)

        inputs.remove(e)

        del msg_dic[e]


